import {OnWindowActivate,SetWpsUserName} from "./wpsEventFunction"
import {
  currentTime,
  getPluginStorageItem,
  DownloadFile,
  GetDocParamsValue,
  initDocParamsValue,
  setDocParamsValue,

} from "../common/common";
import {
} from "./wpsCommon"

import {GetParamsValue} from "./onWpsControl"
import {WPS_Enum, constWpsEnum, Enum996CodeOfficeFlag, EnumDocLandMode, WdWindowState} from "./enum.js"
/**
 * 从OA调用传来的指令，打开本地新建文件
 * @param {*} fileUrl 文件url路径
 */
export function NewFile(params) {
    //获取WPS Application 对象
    var wpsApp = wps.WpsApplication();
    //判断一下isOfficialDocument是否通过公文写作打开
    var doc;
    //新增OA端文档
    doc = wpsApp.Documents.Add();
    //检查系统临时文件目录是否能访问
    if (wps.Env && wps.Env.GetTempPath) {
        if (params.newFileName) {
            //按OA传入的文件名称保存
            doc.SaveAs2( wps.Env.GetTempPath() + "/" + params.newFileName, undefined, undefined, undefined, false);
        } else {
            //OA传入空文件名称，则保存成系统时间文件
            doc.SaveAs2(wps.Env.GetTempPath() + "/996CodeWps_" + currentTime(), undefined, undefined, undefined, false);
        }
    } else {
        alert("文档保存临时目录出错！不能保存新建文档！请联系系统开发商。");
    }

    //Office文件打开后，设置该文件属性：从服务端来的Office文件
    pSetIs996CodeOffice(doc, params);
    //设置当前文档为 本地磁盘落地模式
    DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc);

    // 设置当前文档对应的用户名
    SetWpsUserName();

    //刷新加载项，并且将窗口激活过去
    OnWindowActivate();

    // 设置窗口大小
    wps.WpsApplication().WindowState= WdWindowState.wdWindowStateNormal;
    //把WPS对象置前
    wps.WpsApplication().Activate();

    return doc; //返回新创建的Document对象
}
/**
 * 打开服务器上的文件
 * @param {*} fileUrl 文件url路径
 */
export function OpenFile(params,callBack) {
  let filePathUrl = params.filePathUrl; //来自OA网页端的OA文件下载路径
  let fileName = params.fileName; //来自OA网页端的OA文件下载路径
  let doc;
  let l_IsOnlineDoc = false; //默认打开的是不落地文档
  if (filePathUrl) {
    //下载文档之前，判断是否已下载该文件
    if (pCheckIsExistOpenOADoc(fileName) == true) {
      //如果找到相同OA地址文档，则给予提示
      wps.WpsApplication().WindowState=1;
      wps.WpsApplication().Activate(); //把WPS对象置前
      //根据OA助手对是否允许再次打开相同文件的判断处理
      let l_AllowOADocReOpen = false;
      l_AllowOADocReOpen = getPluginStorageItem(constWpsEnum.AllowOADocReOpen);
      if (l_AllowOADocReOpen == false) {
        alert("已打开相同的OA文件，请关闭之前的文件，再次打开。");
        wps.WpsApplication().Activate();
        return null;
      } else {
        //处理重复打开相同OA 文件的方法
        let nDocCount = wps.WpsApplication().Documents.Count;
        pReOpenOADoc(filePathUrl);
        //重复打开的文档采用不落地的方式打开
        // 不落地方式打开文档判断落地比较多，V1版本先暂时关闭
        l_IsOnlineDoc = true;
        let nDocCount_New = wps.WpsApplication().Documents.Count;
        if (nDocCount_New > nDocCount) {
          doc = wps.WpsApplication().ActiveDocument;
        }
      }
    } else {
      //如果当前没有打开文档，则另存为本地文件，再打开
      if (filePathUrl.indexOf("http") == 0) { // 网络文档
        DownloadFile(filePathUrl,fileName, function(path) {
          if (path == "") {
            alert("从服务端下载路径：" + filePathUrl + "\n" + "获取文件下载失败！");
            return null;
          }

          doc = pDoOpenOADocProcess(params, path);
          pOpenFile(doc, params, l_IsOnlineDoc);
          if(typeof callBack == "function"){
            callBack(doc);
          }
        });
        return;
      }
    }
  } else {
    //fileURL 如果为空，则按新建OA本地文件处理
    alert("文件路径错误！")
  }
  //如果打开pdf等其他非Office文档，则doc对象为空
  if (!doc) {
    alert("文件打开失败！")
  }

  pOpenFile(doc, params, l_IsOnlineDoc);
}



/**
 * 打开服务端的文档（不落地）
 * @param {*} fileUrl 文件url路径
 */
export function OpenOnLineFile(docParams) {
  //OA参数如果为空的话退出
  if (!docParams) return;

  //获取在线文档URL
  var filePathUrl = docParams.filePathUrl;
  var l_doc;
  if (filePathUrl) {
    //下载文档不落地（16版WPS的925后支持）
    wps.WpsApplication().Documents.OpenFromUrl(filePathUrl,OnOpenOnLineDocSuccess, OnOpenOnLineDocDownFail);
    l_doc = wps.WpsApplication().ActiveDocument;
  }
  //执行文档打开后的方法
  pOpenFile(l_doc, docParams, true);
  return l_doc;
}

//Office文件打开后，设置该文件属性：从服务端来的OA文件
function pSetIs996CodeOffice(doc, params) {
  if (!doc) {
    return; //
  }

  params[constWpsEnum.is996Code] = Enum996CodeOfficeFlag.YES; //设置OA打开文档的标志

  params.SourcePath = doc.FullName; //保存OA的原始文件路径，用于保存时分析，是否进行了另存为操作
  params[constWpsEnum.RevisionEnableFlag] = false;
  //弹出上传成功后的提示信息
  params[constWpsEnum.Save2OAShowConfirm] = true;

  initDocParamsValue(doc, params);
}

/**
 * 打开在线文档成功后触发事件
 * @param {*} resp
 */
function OnOpenOnLineDocSuccess(resp) {

}


/**
 *  打开在线不落地文档出现失败时，给予错误提示
 */
function OnOpenOnLineDocDownFail(res) {
  var err={}
  try{
    res=JSON.parse(res)
    err.Body=Base64.decode(res.Body)
    err.Headers=Base64.decode(JSON.stringify(res.Headers))
    console.log(err)
  }catch(err){

  }
  alert("打开在线不落地文档失败！请尝试重新打开。");
  return;
}

/**
 * 参数：
 * doc : 当前文档的Document对象
 * DocLandMode ： 落地模式设置
 */
function DoSetOADocLandMode(doc, DocLandMode) {
  if (!doc) return;
  setDocParamsValue(doc,constWpsEnum.OADocLandMode,DocLandMode)
  // let l_Param = wps.PluginStorage.getItem(doc.DocID);
  // let l_objParam = JSON.parse(l_Param);
  // //增加属性，或设置
  // l_objParam.OADocLandMode = DocLandMode; //设置OA文档的落地标志
  //
  // let l_p = JSON.stringify(l_objParam);
  // //将OA文档落地模式标志存入系统变量对象保存
  //
  // wps.PluginStorage.setItem(doc.DocID, l_p);

}



/**
 * 功能说明：判断是否已存在来自OA的已打开的文档
 * @param {字符串} FileURL
 */
function pCheckIsExistOpenOADoc(fileName) {
  let l_DocCount = wps.WpsApplication().Documents.Count;
  if (l_DocCount <= 0) return false;
  //轮询检查当前已打开的WPS文档中，是否存在OA相同的文件
  if (l_DocCount >= 1) {
    for (let l_index = 1; l_index <= l_DocCount; l_index++) {
      let l_objDoc = wps.WpsApplication().Documents.Item(l_index);
      let fileNameTemp = GetDocParamsValue(l_objDoc,"fileName")
      // let l_strParam = wps.PluginStorage.getItem(l_objDoc.DocID);
      // if (l_strParam == null)
      //   continue;
      // let l_objParam = JSON.parse(l_strParam)
      if (fileNameTemp == fileName) {
        return true;
      }
    }
    return false;
  }
}

/**
 *   描述：如何处理再次打开相同的OA文件
 *   返回值：打开的Document对象
 */
function pReOpenOADoc(filePathUrl) {
  if (wps.confirm("当前环境已打开该文件，是否重新再打开一份？")) {
    //如果用户选择再次打开，则用在线方式打开
    wps.WpsApplication().Documents.OpenFromUrl(filePathUrl, "", "");
  }
}



/**
 * 作用：打开文档处理的各种过程，包含：打开带密码的文档，保护方式打开文档，修订方式打开文档等种种情况
 * params	Object	OA Web端传来的请求JSON字符串，具体参数说明看下面数据
 * TempLocalFile : 字符串 先把文档从OA系统下载并保存在Temp临时目录，这个参数指已经下载下来的本地文档地址
 * ----------------------以下是OA参数的一些具体规范名称
 * docId	String	文档ID
 * openType	String	文档打开方式 ，不传正常打开
 *      protectType	String	文档保护类型，-1：不启用保护模式，0：只允许对现有内容进行修订，1：只允许添加批注，2：只允许修改窗体域，3：只读
 *      password	String  保护模式下的文档密码
 *      docPassword	String  打开文件的密码
 */
function pDoOpenOADocProcess(params, TempLocalFile) {
  let l_ProtectType = -1; //默认文档保护类型 -1 为不启用保护
  let l_ProtectPassword = ""; //默认文档密码为空

  let l_strDocPassword = ""; //打开文档密码参数
  let l_bOpenRevision = false; //初始化关闭修订模式
  let l_bShowRevision = false; //初始化不显示修订气泡样式

  for (const key of Object.keys(params)) {
    switch (key.toUpperCase()) {
      case "openType".toUpperCase():
        l_ProtectType = params[key].protectType; //获取OA传来的文档保护类型
        l_ProtectPassword = params[key].password; //获取OA传来的保护模式下的文档密码
        break;
      case "docPassword".toUpperCase(): //传入打开文件的密码
        l_strDocPassword = params[key].docPassword;
        break;
    }
  }
  let l_Doc;
  // Open方法的参数说明如下
  //Function Open(FileName, [ConfirmConversions], [ReadOnly], [AddToRecentFiles],
  //  [PasswordDocument], [PasswordTemplate], [Revert], [WritePasswordDocument],
  //  [WritePasswordTemplate], [Format], [Encoding], [Visible],
  //  [OpenAndRepair], [DocumentDirection], [NoEncodingDialog], [XMLTransform]) As Document
  l_Doc = wps.WpsApplication().Documents.Open(TempLocalFile, false, false, false, l_strDocPassword);

  //设置文档修订状态
  DoOADocOpenRevision(l_Doc, l_bOpenRevision, l_bShowRevision);

  //打开文档后，根据保护类型设置文档保护
  if (l_ProtectType > -1) // -1 :不设置文档保护
    SetOADocProtect(l_Doc, l_ProtectType, l_ProtectPassword);
  return l_Doc;
}


/**
 * 打开/关闭修订
 * @param {*} doc :传入文档对象
 * @param {*} bOpenRevision :  布尔值，是否允许打开修订模式，true:打开/false:关闭
 * @param {*} bOpenRevision ： 布尔值，是否显示修订痕迹状态
 * 返回值：无
 */
function DoOADocOpenRevision(doc, bOpenRevision, bShowRevision) {
  if (!doc) return;

  doc.TrackRevisions = bOpenRevision; //如果标记对指定文档的修改，则该属性值为True
  let l_v = doc.ActiveWindow.View;
  l_v.ShowRevisionsAndComments = bShowRevision; //如果为True，则 WPS 显示使用“修订”功能对文档所作的修订和批注
  l_v.RevisionsBalloonShowConnectingLines = bShowRevision; //如果为 True，则 WPS 显示从文本到修订和批注气球之间的连接线
  wps.WpsApplication().CommandBars.ExecuteMso("KsoEx_RevisionCommentModify_Disable"); //去掉修改痕迹信息框中的接受修订和拒绝修订勾叉，使其不可用

  if (bShowRevision) {
    doc.ActiveWindow.ActivePane.View.RevisionsMode = 2; //2为不支持气泡显示。
  }

  //如果关闭修订,关闭显示痕迹并将按钮至灰
  wps.ribbonUI.InvalidateControl("btnOpenRevision");
  wps.ribbonUI.InvalidateControl("btnShowRevision");

  return;
}



/**
 * protectType: '', 文档保护模式(   -1：不启用保护模式，
 *                                  0：只允许对现有内容进行修订，
 *                                  1：只允许添加批注，
 *                                  2：只允许修改窗体域，
 *                                  3：只读)
 * @param {*} protectType
 * @param {*} doc
 */
function SetOADocProtect(doc, protectType, ProtectPassword) {
  if (!doc) return; //校验文档是否存在
  if ([0, 1, 2, 3].indexOf(protectType) !== -1) {
    // 保护文档如果之前有被保护，再次保护会出问题，需要先解除保护
    doc.Unprotect();
    // ** 方法参数
    // ** Protect(Type As WdProtectionType, [NoReset], [Password], [UseIRM], [EnforceStyleLock])
    doc.Protect(protectType, false, ProtectPassword, false);
  }
  return;
}



/**
 * 作用：文档打开后执行的动作集合
 * @param {*} doc 文档对象
 * @param {*} params 前端传递的参数集合
 * @param {*} isOnlineDoc 在线打开/落地打开
 */
function pOpenFile(doc, params, isOnlineDoc) {
  var l_IsOnlineDoc = isOnlineDoc
  //Office文件打开后，设置该文件属性：从服务端来的OA文件
  pSetIs996CodeOffice(doc, params)
  //设置当前文档为 本地磁盘落地模式
  if (l_IsOnlineDoc == true) {
    DoSetOADocLandMode(doc, EnumDocLandMode.DLM_OnlineDoc);
  } else {
    DoSetOADocLandMode(doc, EnumDocLandMode.DLM_LocalDoc);
  }

  // todo yinjt 往word里面写入业务数据
  // if (GetParamsValue(params, constStrEnum.templateDataUrl)) {
  //   GetServerTemplateData(doc, params[constStrEnum.templateDataUrl]);
  // }
  //
  // if (GetParamsValue(params, constStrEnum.insertFileUrl)) {
  //   InsertRedHeadDoc(doc);
  // }

  // 设置当前文档对应的用户名
  SetWpsUserName();

  // 触发切换窗口事件
  OnWindowActivate();
  // 把WPS对象置前
  wps.WpsApplication().WindowState=1;
  wps.WpsApplication().Activate();
  return doc;
}

